//函数递归
//代码简洁,不一定效率

#include<stdio.h>
#include<string.h>

//函数不允许创建临时变量,求字符长度

//传统临时变量
int my_strlen0(char*str)
//取址只会取第一个
{
    int count = 0;
    while (*str != '\0')//
    {
        count++;
        str++;//指针偏移,指针地址下后移一位
    }
    return count;
}

//没有临时变量
int my_strlen1(char*str)
{
    if (*str != '\0')
    {
        return 1+my_strlen1(str+1);//str+1为下一个字符地址
        //return 1+my_strlen1(str++);//错误,str+1,相当于传入新的参数(str+1),而str++将全部str赋值为str+1

    }
    else
        return 0;
}

//n!
int fac(int n)
{
    if (n<=1)
    {
        return 1;
    }
    else 
    {
        return n*fac(n-1);
    }
}

//第n个斐波那契数
//递归
int fib(int a)
{
    if (a<=2)
    {
        return 1;
    }
    else
    {
        return (fib(a-1)+fib(a-2));
    }
}
//循环
int fib1(int a)
{
   if (a<=2)
   {
    return 1;
   }
   int n=2;
   int ret =1;
   int ret1 =1;
   int ret2 =0;
   while (n<=a)
   {
    ret =ret1+ret2;
    ret2 = ret1;
    ret1 =ret;
    n++;
   }
   return ret;
    
}


int main()
{
//     char arr[]="abc";
//     printf("%d\n",strlen(arr));
//     //printf("%d\n",my_strlen0(arr));
//     printf("%d\n",my_strlen1(arr));
//
    int n=0;
    scanf("%d",&n);
   // printf("%d\n",fac(n));
    printf("%d\n",fib1(n));
    printf("%d\n",fib(n));
 }